package net.wanglu.www.spdr.rule;

import java.util.HashMap;
import java.util.regex.Pattern;

/**
 * Rule接口定义了站点中的一些规则。这些规则包括：
 * 指明站点主页的链接。
 * 指明站点页面的字符编码。
 * 站点中有效链接的命名规则，即有效链接在命名上具有哪些特征。有效链接是指
 * 该链接中含有待抓取的内容。
 * 站点中有效内容的标签规则，即有效内容存在于哪些html标签之中，这些标签
 * 具有哪些特征。有效内容是指待抓取的内容。
 * 站点中有效内容标签的标签规则，即有效内容的标题存在于哪些html标签中，
 * 这些标签具有哪些特征。
 * 站点中有效内容正文的标签规则，即有效内容的正文存在于哪些html标签中，
 * 这些标签具有哪些特征。
 * 站点中有效内容发布日期的标签规则，即有效内容的发布日期存在于哪些html
 * 标签中，这些标签具有哪些特征。
 * 站点中有效内容摘要的标签规则，即有效内容的摘要存在于哪些html标签 中，
 * 这些标签具有哪些特征。
 * @author deadspace
 *
 */
public interface Rule {

	/**
	 * 用来表征节点间的父子关系，目前只描述父子两层关系，
	 * 不涉及父子祖先等多层关系。这个属性表征父节点。
	 */
	public static final int FATHER = 0;
	/**
	 * 用来表征节点间的父子关系，目前只描述父子两层关系，
	 * 不涉及父子祖先等多层关系。这个属性表征子节点。
	 */
	public static final int SON = 1;
	/**
	 * TagName表示依据标签的名字来获取特征的
	 */
	public static final String ELEMENT_NAME = "ElementName";
	/**
	 * 站点主页的url
	 * @return 返回一个字符串，表示主页的url
	 * @throws Exception
	 */
	public String homeUrl() throws Exception;
	/**
	 * 站点页面的字符编码
	 * @return 返回一个字符串，表示页面的字符编码
	 * @throws Exception
	 */
	public String charSet() throws Exception;
	/**
	 * 在web站点中，有些有意义的内容往往存在于2级、3级或更深层的页面中。
	 * 为了获取这些页面的链接，需要分析这些链接在其祖先页面中的链接特征。
	 * @return 返回含有有意义内容的链接特征，这些特征以正则表达式的方
	 * 式存储在Pattern对象中。
	 * @throws Exception
	 */
	public Pattern validUrlRule() throws Exception;
	/**
	 * 在html页面中，想要抓取的内容存在于哪个标签中，返回这个标签的特征。
	 * @return 返回一个Map对象，Map中的键表明依据什么采集的特征——
	 * 或者是依据标签的名称或者是依据标签的某个属性。Map中的值表示具体的
	 * 特征——如果是依据标签名称采集的特征那么这个标签名称是什么，如果是依
	 * 据标签的某个属性采集的特征那么这个属性的值是什么。
	 * @throws Exception
	 */
	public HashMap<String, String> targetTagRule() throws Exception;
	/**
	 * 想要抓取的内容，它的标题存在哪个标签中，返回这个标签的特征。
	 * @return 返回一个Map对象，Map中的键表明依据什么采集的特征——
	 * 或者是依据标签的名称或者是依据标签的某个属性。Map中的值表示具体的
	 * 特征——如果是依据标签名称采集的特征那么这个标签名称是什么，如果是依
	 * 据标签的某个属性采集的特征那么这个属性的值是什么。
	 * @throws Exception
	 */
	public HashMap<String, String> titleTagRule() throws Exception;
	/**
	 * 在html页面中，想要抓取的内容正文存在于哪个标签中，返回这个标签的
	 * 特征。
	 * @return 返回一个Map对象，Map中的键表明依据什么采集的特征——
	 * 或者是依据标签的名称或者是依据标签的某个属性。Map中的值表示具体的
	 * 特征——如果是依据标签名称采集的特征那么这个标签名称是什么，如果是依
	 * 据标签的某个属性采集的特征那么这个属性的值是什么。
	 * @throws Exception
	 */	
	public HashMap<String, String> textTagRule() throws Exception;
	/**
	 * 在html页面中，想要抓取内容的发布日期存在于哪个标签中，返回这个标
	 * 签的特征。
	 * @return 返回一个Map对象，Map中的键表明依据什么采集的特征——
	 * 或者是依据标签的名称或者是依据标签的某个属性。Map中的值表示具体的
	 * 特征——如果是依据标签名称采集的特征那么这个标签名称是什么，如果是依
	 * 据标签的某个属性采集的特征那么这个属性的值是什么。
	 * @throws Exception
	 */		
	public HashMap<String, String> dateTagRule() throws Exception;
	/**
	 * 在html页面中，想要抓取内容的摘要存在于哪个标签中，返回这个标签的
	 * 特征。
	 * @return 返回一个Map对象，Map中的键表明依据什么采集的特征——
	 * 或者是依据标签的名称或者是依据标签的某个属性。Map中的值表示具体的
	 * 特征——如果是依据标签名称采集的特征那么这个标签名称是什么，如果是依
	 * 据标签的某个属性采集的特征那么这个属性的值是什么。
	 * @throws Exception
	 */		
	public HashMap<String, String> abstractTagRule() throws Exception;
	/**
	 * 在html页面中，想要抓取内容的小标题存在于哪个标签中，返回这个标签的
	 * 特征。
	 * @return 返回一个Map对象，Map中的键表明依据什么采集的特征——
	 * 或者是依据标签的名称或者是依据标签的某个属性。Map中的值表示具体的
	 * 特征——如果是依据标签名称采集的特征那么这个标签名称是什么，如果是依
	 * 据标签的某个属性采集的特征那么这个属性的值是什么。
	 * @throws Exception
	 */		
	public HashMap<String, String> crossHeadTagRule() throws Exception;
	/**
	 * 想要抓取的内容，它的作者存在哪个标签中，返回这个标签的特征。
	 * @return 返回一个Map对象，Map中的键表明依据什么采集的特征——
	 * 或者是依据标签的名称或者是依据标签的某个属性。Map中的值表示具体的
	 * 特征——如果是依据标签名称采集的特征那么这个标签名称是什么，如果是依
	 * 据标签的某个属性采集的特征那么这个属性的值是什么。
	 * @throws Exception
	 */
	public HashMap<String, String> authorTagRule() throws Exception;
	/**
	 * 在web站点中，有些有效链接指向的 页面含有敏感内容、或含有一些无意义
	 * 的内容，比如电视节目表、广告等。因此需要将这些无意义的链接通过规则
	 * 过滤掉。
	 * @return 返回无意义内容的链接特征，这些特征以正则表达式的方式存储
	 * 在Pattern对象中。
	 * @throws Exception
	 */
	public Pattern rejectedUrlRule() throws Exception;
}
